home *** CD-ROM | disk | FTP | other *** search
- Path: uunet!cs.utexas.edu!tut.cis.ohio-state.edu!rutgers!aramis.rutgers.edu!dartagnan.rutgers.edu!mcgrew
- From: mcgrew@dartagnan.rutgers.edu (Charles Mcgrew)
- Newsgroups: comp.sources.sun
- Subject: v01i023: Tooltool - a suntools user interface builder, Part 04/13
- Message-ID: <Jun.7.00.13.04.1989.23536@dartagnan.rutgers.edu>
- Date: 7 Jun 89 04:13:08 GMT
- Organization: Rutgers Univ., New Brunswick, N.J.
- Lines: 1592
- Approved: mcgrew@aramis.rutgers.edu
-
- Submitted-by: Chuck Musciano <chuck@trantor.harris-atd.com>
- Posting-number: Volume 1, Issue 23
- Archive-name: tooltool2.1c/part04
-
- #! /bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of archive 4 (of 13)."
- # Contents: actions.c events.c misc.c tooltool.h
- # Wrapped by chuck@melmac on Thu Jun 1 10:39:29 1989
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f 'actions.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'actions.c'\"
- else
- echo shar: Extracting \"'actions.c'\" \(8513 characters\)
- sed "s/^X//" >'actions.c' <<'END_OF_FILE'
- X/************************************************************************/
- X/* Copyright 1988 by Chuck Musciano and Harris Corporation */
- X/* */
- X/* Permission to use, copy, modify, and distribute this software */
- X/* and its documentation for any purpose and without fee is */
- X/* hereby granted, provided that the above copyright notice */
- X/* appear in all copies and that both that copyright notice and */
- X/* this permission notice appear in supporting documentation, and */
- X/* that the name of Chuck Musciano and Harris Corporation not be */
- X/* used in advertising or publicity pertaining to distribution */
- X/* of the software without specific, written prior permission. */
- X/* Chuck Musciano and Harris Corporation make no representations */
- X/* about the suitability of this software for any purpose. It is */
- X/* provided "as is" without express or implied warranty. */
- X/* */
- X/* The sale of any product based wholely or in part upon the */
- X/* technology provided by tooltool is strictly forbidden without */
- X/* specific, prior written permission from Harris Corporation. */
- X/* Tooltool technology includes, but is not limited to, the source */
- X/* code, executable binary files, specification language, and */
- X/* sample specification files. */
- X/************************************************************************/
- X
- X#include <stdio.h>
- X#include <ctype.h>
- X
- X#include "tooltool.h"
- X
- X#include <suntool/tty.h>
- X
- XPUBLIC Tty tty;
- X
- X/************************************************************************/
- XPRIVATE send_text(p)
- X
- Xchar *p;
- X
- X{ int len, sent;
- X
- X if (tty)
- X if (p && *p)
- X for (len = strlen(p), sent = 0; sent < len; )
- X sent += ttysw_input(tty, p + sent, len - sent);
- X}
- X
- X/************************************************************************/
- XPRIVATE do_open()
- X
- X{ d_ptr d;
- X
- X window_set(tt_base_window->frame, FRAME_CLOSED, FALSE, 0);
- X for (d = tt_base_window->next; d; d = d->next)
- X if (d->is_open)
- X window_set(d->frame, WIN_SHOW, TRUE, 0);
- X}
- X
- X/************************************************************************/
- XPRIVATE do_close()
- X
- X{ d_ptr d;
- X
- X window_set(tt_base_window->frame, FRAME_CLOSED, TRUE, 0);
- X for (d = tt_base_window->next; d; d = d->next)
- X if (d->is_open)
- X window_set(d->frame, WIN_SHOW, FALSE, 0);
- X}
- X
- X/************************************************************************/
- XEXPORT a_ptr tt_make_action(op, arg1, arg2, arg3, arg4)
- X
- Xint op;
- Xe_ptr arg1, arg2, arg3, arg4;
- X
- X{ a_ptr a;
- X
- X a = (a_ptr) safe_malloc(sizeof(a_data));
- X a->next = NULL;
- X switch (a->op = op) {
- X case BEEP_OP :
- X case BREAK_OP :
- X case CLOSE_OP :
- X case CONTINUE_OP :
- X case EXIT_OP :
- X break;
- X case DISPLAY_OP :
- X case EXPR_OP :
- X case POPUP_OP :
- X case REMOVE_OP :
- X case SEND_OP : a->expr = arg1;
- X break;
- X case FOR_OP : a->init = arg1;
- X a->expr = arg2;
- X a->term = arg3;
- X a->body = (a_ptr) arg4;
- X break;
- X case IF_OP : a->expr = arg1;
- X a->body = (a_ptr) arg2;
- X a->else_part = (a_ptr) arg3;
- X break;
- X case WHILE_OP : a->expr = arg1;
- X a->body = (a_ptr) arg2;
- X break;
- X }
- X return(a);
- X}
- X
- X/************************************************************************/
- XEXPORT tt_do_action(a)
- X
- Xa_ptr a;
- X
- X{ d_ptr d;
- X static int in_a_popup = FALSE, exit_pending = FALSE, close_pending = FALSE, open_pending = FALSE;
- X static int break_pending = FALSE, continue_pending = FALSE;
- X
- X tt_action_depth++;
- X for ( ; a && !break_pending && !continue_pending; a = a->next) {
- X tt_reset_emalloc();
- X if (tt_timer_pending) {
- X tt_timer_pending = FALSE;
- X tt_do_action(tt_timer_action);
- X }
- X switch (a->op) {
- X case BEEP_OP : window_bell(tt_base_window->frame);
- X break;
- X case BREAK_OP : break_pending = TRUE;
- X break;
- X case CLOSE_OP : if (in_a_popup)
- X close_pending = TRUE;
- X else
- X do_close();
- X break;
- X case CONTINUE_OP: continue_pending = TRUE;
- X break;
- X case DISPLAY_OP : if (a->expr->symbol->kind == SYMBOL_SYMBOL)
- X abend("display: cannot display %s, which is not a dialog box or gadget", a->expr->symbol->name);
- X else if (a->expr->symbol->kind == SYMBOL_GADGET) {
- X if (a->expr->symbol->gadget == NULL)
- X abend("dialog box %s was never defined", a->expr->symbol->name);
- X panel_set(a->expr->symbol->gadget->panel_item, PANEL_SHOW_ITEM, TRUE, 0);
- X }
- X else {
- X if ((d = a->expr->symbol->dialog) == NULL)
- X abend("dialog box %s was never defined", a->expr->symbol->name);
- X window_set(d->frame, WIN_SHOW, TRUE, 0);
- X tt_do_action(d->open_action);
- X d->is_open = TRUE;
- X d->is_popup = FALSE;
- X }
- X break;
- X case EXIT_OP : if (in_a_popup)
- X exit_pending = TRUE;
- X else
- X exit(0);
- X break;
- X case EXPR_OP : tt_eval(a->expr);
- X break;
- X case FOR_OP : for (tt_eval(a->init); (int) tt_eval(a->expr)->number; tt_eval(a->term)) {
- X tt_do_action(a->body);
- X if (break_pending) {
- X break_pending = FALSE;
- X break;
- X }
- X if (continue_pending) {
- X continue_pending = FALSE;
- X continue;
- X }
- X }
- X break;
- X case IF_OP : tt_do_action(((int) tt_eval(a->expr)->number)? a->body : a->else_part);
- X break;
- X case OPEN_OP : if (in_a_popup)
- X open_pending = TRUE;
- X else
- X do_open();
- X break;
- X case POPUP_OP : if (a->expr->symbol->kind != SYMBOL_DIALOG)
- X abend("popup: %s is not a dialog box", a->expr->symbol->name);
- X else if ((d = a->expr->symbol->dialog) == NULL)
- X abend("dialog box %s was never defined", a->expr->symbol->name);
- X else if (d->is_open)
- X abend("popup: dialog box %s is already open", a->expr->symbol->name);
- X else if (in_a_popup)
- X abend("nested popup windows are not allowed");
- X d->is_open = TRUE;
- X d->is_popup = TRUE;
- X tt_do_action(d->open_action);
- X in_a_popup = TRUE;
- X window_loop(d->frame);
- X in_a_popup = FALSE;
- X tt_do_action(d->close_action);
- X d->is_open = FALSE;
- X d->is_popup = TRUE;
- X if (close_pending)
- X do_close();
- X if (open_pending)
- X do_open();
- X if (exit_pending)
- X exit(0);
- X close_pending = open_pending = exit_pending = FALSE;
- X break;
- X case REMOVE_OP : if (a->expr->symbol->kind == SYMBOL_SYMBOL)
- X abend("remove: cannot remove %s, which is not a dialog box or gadget", a->expr->symbol->name);
- X else if (a->expr->symbol->kind == SYMBOL_GADGET) {
- X if (a->expr->symbol->gadget == NULL)
- X abend("gadget %s was never defined", a->expr->symbol->name);
- X panel_set(a->expr->symbol->gadget->panel_item, PANEL_SHOW_ITEM, FALSE, 0);
- X }
- X else {
- X if ((d = a->expr->symbol->dialog) == NULL)
- X abend("dialog box %s was never defined", a->expr->symbol->name);
- X if (d->is_open)
- X if (d->is_popup)
- X window_return(0);
- X else {
- X window_set(d->frame, WIN_SHOW, FALSE, 0);
- X tt_do_action(d->close_action);
- X d->is_open = FALSE;
- X d->is_popup = FALSE;
- X }
- X }
- X break;
- X case SEND_OP : send_text(tt_string_of(tt_eval(a->expr)));
- X break;
- X case WHILE_OP : while ((int) tt_eval(a->expr)->number) {
- X tt_do_action(a->body);
- X if (break_pending) {
- X break_pending = FALSE;
- X break;
- X }
- X if (continue_pending) {
- X continue_pending = FALSE;
- X continue;
- X }
- X }
- X break;
- X default : abend("Internal error! Undefined action: %d", a->op);
- X }
- X }
- X if (--tt_action_depth == 0) {
- X if (continue_pending)
- X abend("continue action used outside of a while or for action");
- X break_pending = FALSE;
- X }
- X}
- END_OF_FILE
- if test 8513 -ne `wc -c <'actions.c'`; then
- echo shar: \"'actions.c'\" unpacked with wrong size!
- fi
- # end of 'actions.c'
- fi
- if test -f 'events.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'events.c'\"
- else
- echo shar: Extracting \"'events.c'\" \(10873 characters\)
- sed "s/^X//" >'events.c' <<'END_OF_FILE'
- X/************************************************************************/
- X/* Copyright 1988 by Chuck Musciano and Harris Corporation */
- X/* */
- X/* Permission to use, copy, modify, and distribute this software */
- X/* and its documentation for any purpose and without fee is */
- X/* hereby granted, provided that the above copyright notice */
- X/* appear in all copies and that both that copyright notice and */
- X/* this permission notice appear in supporting documentation, and */
- X/* that the name of Chuck Musciano and Harris Corporation not be */
- X/* used in advertising or publicity pertaining to distribution */
- X/* of the software without specific, written prior permission. */
- X/* Chuck Musciano and Harris Corporation make no representations */
- X/* about the suitability of this software for any purpose. It is */
- X/* provided "as is" without express or implied warranty. */
- X/* */
- X/* The sale of any product based wholely or in part upon the */
- X/* technology provided by tooltool is strictly forbidden without */
- X/* specific, prior written permission from Harris Corporation. */
- X/* Tooltool technology includes, but is not limited to, the source */
- X/* code, executable binary files, specification language, and */
- X/* sample specification files. */
- X/************************************************************************/
- X
- X#include <stdio.h>
- X#include <ctype.h>
- X
- X#include "tooltool.h"
- X
- X#include <suntool/tty.h>
- X
- XPUBLIC Tty tty;
- X
- XPRIVATE int value_invalid = FALSE;
- XPRIVATE struct itimerval timer_int;
- X
- X/************************************************************************/
- X/* These routines deal with managing tooltool events */
- X/************************************************************************/
- X
- X/************************************************************************/
- XPRIVATE int get_shifts(event)
- X
- XEvent *event;
- X
- X{ int shifts = 0;
- X
- X if (event_shift_is_down(event))
- X shifts += S_SHIFT;
- X if (event_ctrl_is_down(event))
- X shifts += S_CONTROL;
- X if (event_meta_is_down(event))
- X shifts += S_META;
- X return(shifts);
- X}
- X
- X/************************************************************************/
- XPRIVATE int is_a_function_key(event)
- X
- XEvent *event;
- X
- X{
- X return(event_is_key_left(event) || event_is_key_top(event) || event_is_key_right(event));
- X}
- X
- X/************************************************************************/
- XPRIVATE a_ptr key_is_mapped(event)
- X
- XEvent *event;
- X
- X{ int set, key;
- X a_ptr a;
- X
- X if (event_is_key_left(event)) {
- X set = LEFT_KEY_SET;
- X key = event_id(event) - KEY_LEFT(1);
- X }
- X else if (event_is_key_top(event)) {
- X set = TOP_KEY_SET;
- X key = event_id(event) - KEY_TOP(1);
- X }
- X else if (event_is_key_right(event)) {
- X set = RIGHT_KEY_SET;
- X key = event_id(event) - KEY_RIGHT(1);
- X }
- X else
- X return(NULL);
- X return(tt_func_keys[set][key][get_shifts(event)]);
- X}
- X
- X/************************************************************************/
- XPRIVATE timer_proc()
- X
- X{
- X if (tt_action_depth > 0)
- X tt_timer_pending = TRUE;
- X else
- X tt_do_action(tt_timer_action);
- X}
- X
- X/************************************************************************/
- XEXPORT Panel_setting notify_proc(item, event)
- X
- XPanel_item item;
- XEvent *event;
- X
- X{ g_ptr b;
- X char *p, buf[1024];
- X int i;
- X cv_ptr cv;
- X
- X b = (g_ptr) panel_get(item, PANEL_CLIENT_DATA);
- X if (b->kind == GADGET_BUTTON)
- X tt_do_action(b->u.but.action[get_shifts(event)]);
- X else if (b->kind == GADGET_TEXT) {
- X if (index(b->u.tex.completion, event_id(event))) {
- X p = (char *) panel_get(item, PANEL_VALUE);
- X if (p = (char *) expand_filename(p))
- X panel_set(item, PANEL_VALUE, p, 0);
- X else
- X window_bell(panel_get(item, PANEL_PARENT_PANEL));
- X }
- X else if (index(b->u.tex.trigger, event_id(event)))
- X tt_do_action(b->u.tex.action);
- X else if (event_id(event) == '\t')
- X if (event_shift_is_down(event))
- X panel_backup_caret(panel_get(item, PANEL_PARENT_PANEL));
- X else
- X panel_advance_caret(panel_get(item, PANEL_PARENT_PANEL));
- X else if (!index(b->u.tex.ignore, event_id(event)))
- X return(PANEL_INSERT);
- X return(PANEL_NONE);
- X }
- X else if (b->kind == GADGET_CHOICE) {
- X i = (int) panel_get(item, PANEL_VALUE);
- X for (cv = b->u.cho.value; i && cv; i--, cv = cv->next)
- X ;
- X if (cv)
- X tt_do_action(cv->action);
- X }
- X else if (b->kind == GADGET_SLIDER)
- X tt_do_action(b->u.sli.action);
- X}
- X
- X/************************************************************************/
- XEXPORT event_proc(item, event)
- X
- XPanel_item item;
- XEvent *event;
- X
- X{ char c;
- X g_ptr b;
- X a_ptr a;
- X d_ptr d;
- X
- X d = (d_ptr) window_get(panel_get(item, PANEL_PARENT_PANEL), WIN_CLIENT_DATA);
- X b = (g_ptr) panel_get(item, PANEL_CLIENT_DATA);
- X if (event_is_ascii(event) || event_is_meta(event))
- X if (d->text_items_exist || tt_normal_off)
- X if (b->kind == GADGET_TEXT && event_id(event) == '\t')
- X notify_proc(item, event);
- X else
- X panel_default_handle_event(item, event);
- X else {
- X c = event_id(event);
- X if (tty)
- X ttysw_input(tty, &c, 1);
- X }
- X else if (is_a_function_key(event)) {
- X if (a = key_is_mapped(event)) {
- X if (event_is_down(event))
- X tt_do_action(a);
- X }
- X else if (!tt_function_off)
- X panel_default_handle_event(item, event);
- X }
- X else { /* handle each panel item type separately */
- X if (b->kind == GADGET_BUTTON) {
- X if (event_is_down(event) && event_id(event) == MS_RIGHT)
- X tt_do_action(menu_show(b->u.but.menu, d->panel, event, 0));
- X else
- X panel_default_handle_event(item, event);
- X }
- X else if (b->kind == GADGET_MENU) {
- X if (event_is_down(event) && event_id(event) == MS_RIGHT) {
- X a = (a_ptr) menu_show(b->u.men.menu, d->panel, event, 0);
- X if (value_invalid)
- X value_invalid = FALSE;
- X else
- X tt_do_action(a);
- X }
- X else
- X panel_default_handle_event(item, event);
- X }
- X else
- X panel_default_handle_event(item, event);
- X }
- X}
- X
- X/************************************************************************/
- XEXPORT background_proc(panel, event)
- X
- XPanel panel;
- XEvent *event;
- X
- X{ char c;
- X a_ptr a;
- X d_ptr d;
- X
- X d = (d_ptr) window_get(panel, WIN_CLIENT_DATA);
- X if (event_is_ascii(event) || event_is_meta(event))
- X if (d->text_items_exist || tt_normal_off)
- X panel_default_handle_event(panel, event);
- X else {
- X c = event_id(event);
- X if (tty)
- X ttysw_input(tty, &c, 1);
- X }
- X else if (is_a_function_key(event)) {
- X if (a = key_is_mapped(event)) {
- X if (event_is_down(event))
- X tt_do_action(a);
- X }
- X else if (!tt_function_off)
- X panel_default_handle_event(panel, event);
- X }
- X else
- X panel_default_handle_event(panel, event);
- X}
- X
- X/************************************************************************/
- XPRIVATE Notify_value handle_mouse(button, shift, tty, event, arg, type)
- X
- Xint button;
- Xint shift;
- XTty tty;
- XEvent *event;
- XNotify_arg arg;
- XNotify_event_type type;
- X
- X{ int x, y;
- X a_ptr a;
- X
- X if (tt_mouse_chars) {
- X x = event_x(event) / charwidth_of(tt_a_font) + tt_mouse_base;
- X y = event_y(event) / charheight_of(tt_a_font) + tt_mouse_base;
- X }
- X else {
- X x = event_x(event) + tt_mouse_base;
- X y = event_y(event) + tt_mouse_base;
- X }
- X if (tt_mouse[button][shift].defined == MOUSE_UNDEFINED)
- X return(notify_next_event_func(tty, event, arg, type));
- X else if (tt_mouse[button][shift].defined == MOUSE_STRING)
- X a = tt_mouse[button][shift].action;
- X else if (tt_mouse[button][shift].defined == MOUSE_MENU) {
- X a = (a_ptr) menu_show(tt_mouse[button][shift].menu, tty, event, 0);
- X if (value_invalid) {
- X a = NULL;
- X value_invalid = FALSE;
- X }
- X }
- X tt_mouse_x->value->number = x;
- X tt_mouse_y->value->number = y;
- X tt_do_action(a);
- X return(NOTIFY_DONE);
- X}
- X
- X/************************************************************************/
- XEXPORT Menu ttymenu_proc(m, op)
- X
- XMenu m;
- XMenu_generate op;
- X
- X{
- X value_invalid = TRUE;
- X return(tt_ttymenu);
- X}
- X
- X/************************************************************************/
- XEXPORT Notify_value close_proc(win, event, arg, type)
- X
- XWindow win;
- XEvent *event;
- XNotify_arg arg;
- XNotify_event_type type;
- X
- X{ int init_closed, curr_closed;
- X Notify_value value;
- X d_ptr d;
- X
- X init_closed = (int) window_get(tt_base_window->frame, FRAME_CLOSED);
- X value = notify_next_event_func(win, event, arg, type);
- X curr_closed = (int) window_get(tt_base_window->frame, FRAME_CLOSED);
- X if (init_closed != curr_closed)
- X if (curr_closed) { /* transition from open to closed */
- X tt_do_action(tt_base_window->close_action);
- X for (d = tt_base_window->next; d; d = d->next)
- X if (d->is_open)
- X window_set(d->frame, WIN_SHOW, FALSE, 0);
- X }
- X else { /* transition from closed to open */
- X tt_do_action(tt_base_window->open_action);
- X for (d = tt_base_window->next; d; d = d->next)
- X if (d->is_open)
- X window_set(d->frame, WIN_SHOW, TRUE, 0);
- X }
- X return(value);
- X}
- X
- X/************************************************************************/
- XEXPORT Notify_value tty_handler(tty, event, arg, type)
- X
- XTty tty;
- XEvent *event;
- XNotify_arg arg;
- XNotify_event_type type;
- X
- X{ a_ptr a;
- X
- X if ((event_is_ascii(event) || event_is_meta(event)) && tt_normal_off)
- X return(NOTIFY_DONE);
- X else if (is_a_function_key(event)) {
- X if (a = key_is_mapped(event)) {
- X if (event_is_down(event))
- X tt_do_action(a);
- X }
- X else if (!tt_function_off)
- X return(close_proc(tty, event, arg, type));
- X return(NOTIFY_DONE);
- X }
- X else if (event_id(event) == MS_LEFT && event_is_down(event))
- X return(handle_mouse(MOUSE_LEFT, get_shifts(event), tty, event, arg, type));
- X else if (event_id(event) == MS_MIDDLE && event_is_down(event))
- X return(handle_mouse(MOUSE_CENTER, get_shifts(event), tty, event, arg, type));
- X else if (event_id(event) == MS_RIGHT && event_is_down(event))
- X return(handle_mouse(MOUSE_RIGHT, get_shifts(event), tty, event, arg, type));
- X else
- X return(close_proc(tty, event, arg, type));
- X}
- X
- X/************************************************************************/
- XEXPORT Notify_value tt_dialog_done(frame)
- X
- XFrame frame;
- X
- X{ d_ptr d;
- X
- X d = (d_ptr) window_get(frame, WIN_CLIENT_DATA);
- X d->is_open = FALSE;
- X tt_do_action(d->close_action);
- X window_set(frame, WIN_SHOW, FALSE, 0);
- X return(NOTIFY_DONE);
- X}
- X
- X/************************************************************************/
- XEXPORT tt_set_timer(sec, usec)
- X
- Xint sec;
- Xint usec;
- X
- X{
- X if (sec != 0 || usec != 0) {
- X timer_int.it_value.tv_sec = timer_int.it_interval.tv_sec = sec;
- X timer_int.it_value.tv_usec = timer_int.it_interval.tv_usec = usec;
- X notify_set_itimer_func(tt_base_window->frame, timer_proc, ITIMER_REAL, &timer_int, NULL);
- X }
- X else
- X notify_set_itimer_func(tt_base_window->frame, timer_proc, ITIMER_REAL, NULL, NULL);
- X}
- END_OF_FILE
- if test 10873 -ne `wc -c <'events.c'`; then
- echo shar: \"'events.c'\" unpacked with wrong size!
- fi
- # end of 'events.c'
- fi
- if test -f 'misc.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'misc.c'\"
- else
- echo shar: Extracting \"'misc.c'\" \(11000 characters\)
- sed "s/^X//" >'misc.c' <<'END_OF_FILE'
- X/************************************************************************/
- X/* Copyright 1988 by Chuck Musciano and Harris Corporation */
- X/* */
- X/* Permission to use, copy, modify, and distribute this software */
- X/* and its documentation for any purpose and without fee is */
- X/* hereby granted, provided that the above copyright notice */
- X/* appear in all copies and that both that copyright notice and */
- X/* this permission notice appear in supporting documentation, and */
- X/* that the name of Chuck Musciano and Harris Corporation not be */
- X/* used in advertising or publicity pertaining to distribution */
- X/* of the software without specific, written prior permission. */
- X/* Chuck Musciano and Harris Corporation make no representations */
- X/* about the suitability of this software for any purpose. It is */
- X/* provided "as is" without express or implied warranty. */
- X/* */
- X/* The sale of any product based wholely or in part upon the */
- X/* technology provided by tooltool is strictly forbidden without */
- X/* specific, prior written permission from Harris Corporation. */
- X/* Tooltool technology includes, but is not limited to, the source */
- X/* code, executable binary files, specification language, and */
- X/* sample specification files. */
- X/************************************************************************/
- X
- X#include <stdio.h>
- X#include <ctype.h>
- X#include <sgtty.h>
- X#include <pwd.h>
- X
- X#include <sys/types.h>
- X#include <sys/stat.h>
- X#include <sys/dir.h>
- X#include <sys/file.h>
- X
- X#include <suntool/sunview.h>
- X#include <suntool/icon_load.h>
- X
- X#include "tooltool.h"
- X
- XPUBLIC char *index(), *rindex(), *getenv();
- X
- Xtypedef struct pc_rec pc_data, *pc_ptr;
- Xtypedef struct fc_rec fc_data, *fc_ptr;
- X
- Xstruct pc_rec {char *path;
- X struct pixrect *image;
- X pc_ptr next;
- X };
- X
- Xstruct fc_rec {char *path;
- X struct pixfont *font;
- X fc_ptr next;
- X };
- X
- XPRIVATE pc_ptr pix_cache = NULL;
- XPRIVATE fc_ptr font_cache = NULL;
- X
- X/************************************************************************/
- XEXPORT char *safe_malloc(size)
- X
- Xint size;
- X
- X{ char *p;
- X
- X if (p = (char *) malloc(size))
- X return(p);
- X else
- X abend("insufficient memory available");
- X}
- X
- X/************************************************************************/
- XEXPORT safe_free(p)
- X
- Xchar *p;
- X
- X{
- X free(p);
- X}
- X
- X/************************************************************************/
- XEXPORT tokenize(line, argc, argv, maxv)
- X
- Xchar *line;
- Xint *argc;
- Xchar *argv[];
- Xint maxv;
- X
- X{ char *buf, match, *delimiters;
- X
- X *argc = 0;
- X buf = (char *) tt_emalloc(strlen(line) * 2 + 1);
- X if ((delimiters = tt_string_of(tt_delimiters->value)) == NULL)
- X delimiters = " \t\n\r\"'";
- X while (*line && (*argc < (maxv - 1))) {
- X while (*line && index(delimiters, *line))
- X if (*line == '"' || *line == '\'')
- X break;
- X else
- X line++;
- X if (*line == '\0')
- X break;
- X argv[(*argc)++] = buf;
- X if (index(delimiters, *line)) { /* scanning a quoted string */
- X match = *line++; /* remove the quote mark */
- X while (*line && (*line != match))
- X *buf++ = *line++;
- X if (*line)
- X line++; /* wipe out quote mark */
- X }
- X else {
- X while (*line && !index(delimiters, *line))
- X *buf++ = *line++;
- X }
- X *buf++ = '\0';
- X }
- X *buf = '\0';
- X argv[*argc] = (char *) 0;
- X}
- X
- X/************************************************************************/
- XEXPORT struct pixrect *tt_load_icon(path)
- X
- Xchar *path;
- X
- X{ char msg[IL_ERRORMSG_SIZE];
- X struct pixrect *p;
- X FILE *f;
- X pc_ptr pc;
- X
- X for (pc = pix_cache; pc; pc = pc->next)
- X if (strcmp(path, pc->path) == 0)
- X return(pc->image);
- X if ((p = icon_load_mpr(path, msg)) == NULL) { /* not in icon format */
- X if ((f = fopen(path, "r")) == NULL)
- X abend("could not open %s", path);
- X if ((p = pr_load(f, NULL)) == NULL)
- X abend("%s must be in either icon or raster file format", path);
- X fclose(f);
- X }
- X pc = (pc_ptr) safe_malloc(sizeof(pc_data));
- X pc->path = strsave(path);
- X pc->image = p;
- X pc->next = pix_cache;
- X pix_cache = pc;
- X return(p);
- X}
- X
- X/************************************************************************/
- XEXPORT struct pixfont *tt_open_font(path)
- X
- Xchar *path;
- X
- X{ struct pixfont *p;
- X fc_ptr pf;
- X
- X for (pf = font_cache; pf; pf = pf->next)
- X if (strcmp(path, pf->path) == 0)
- X return(pf->font);
- X if ((p = pf_open(path)) == NULL)
- X abend("cannot open font: %s", path);
- X pf = (fc_ptr) safe_malloc(sizeof(fc_data));
- X pf->path = strsave(path);
- X pf->font = p;
- X pf->next = font_cache;
- X font_cache = pf;
- X return(p);
- X}
- X
- X/************************************************************************/
- XEXPORT int text_width(text, font)
- X
- Xunsigned char *text;
- Xstruct pixfont *font;
- X
- X{ int width;
- X
- X for (width = 0; *text; text++)
- X width += font->pf_char[*text].pc_adv.x;
- X return(width);
- X}
- X
- X/************************************************************************/
- XPRIVATE char *root_path(path)
- X
- Xchar *path;
- X
- X{ char *p;
- X
- X if (p = rindex(path, '/'))
- X if (p == path)
- X p[1] = '\0';
- X else
- X *p = '\0';
- X else
- X *path = '\0';
- X return(path);
- X}
- X
- X/************************************************************************/
- XPRIVATE char *last_node(path)
- X
- Xchar *path;
- X
- X{ char *p;
- X
- X return((p = rindex(path, '/'))? p + 1 : path);
- X}
- X
- X/************************************************************************/
- XEXPORT char *expand_filename(path)
- X
- Xchar *path;
- X
- X{ static char s[1024];
- X char pattern[1024], candidate[1024], *p,*q;
- X DIR *dir;
- X struct direct *dp;
- X struct passwd *pw;
- X
- X strcpy(s, path);
- X if (*path == '~')
- X if (path[1] == '/' || path[1] == '\0') {
- X strcpy(s, getenv("HOME"));
- X strcat(s, path + 1);
- X }
- X else {
- X if ((p = index(path, '/')) != NULL)
- X *p = '\0';
- X if ((pw = getpwnam(path + 1)) != NULL) {
- X strcpy(s, pw->pw_dir);
- X if (p != NULL) {
- X strcat(s, "/");
- X strcat(s, p + 1);
- X }
- X }
- X else
- X return(NULL);
- X }
- X strcpy(pattern, last_node(s));
- X if (*pattern == '\0')
- X return(s);
- X root_path(s);
- X candidate[0] = '\0';
- X if (*s == '\0')
- X strcpy(s, ".");
- X if ((dir = opendir(s)) == NULL) {
- X strcpy(s, path);
- X return(s);
- X }
- X while ((dp = readdir(dir)) != NULL)
- X if (strncmp(dp->d_name, pattern, strlen(pattern)) == 0)
- X if (*candidate == '\0')
- X strcpy(candidate, dp->d_name);
- X else {
- X for (p = candidate, q = dp->d_name; *p == *q; p++, q++)
- X ;
- X *p = '\0';
- X }
- X closedir(dir);
- X if (*candidate == '\0')
- X return(NULL);
- X else {
- X if (strcmp(s, ".") == 0)
- X *s = '\0';
- X else if (s[strlen(s) - 1] != '/')
- X strcat(s, "/");
- X strcat(s, candidate);
- X }
- X return(s);
- X}
- X
- X/************************************************************************/
- XEXPORT tt_construct_label(l)
- X
- Xl_ptr l;
- X
- X{ struct pr_prpos where;
- X
- X if (!l->is_icon && l->image == NULL) {
- X l->image = mem_create(text_width(l->label, l->font), l->font->pf_defaultsize.y, 1);
- X where.pr = l->image;
- X where.pos.x = 0;
- X where.pos.y = baseline_of(l->font);
- X pf_text(where, PIX_SRC, l->font, l->label);
- X }
- X}
- X
- X/************************************************************************/
- XEXPORT l_ptr tt_make_label(is_icon, label, font, image)
- X
- Xint is_icon;
- Xchar *label;
- XPixfont *font;
- Xstruct pixrect *image;
- X
- X{ l_ptr l;
- X
- X l = (l_ptr) safe_malloc(sizeof(l_data));
- X l->is_icon = is_icon;
- X l->label = label;
- X l->font = font;
- X l->image = image;
- X return(l);
- X}
- X
- X/************************************************************************/
- XEXPORT d_ptr tt_make_base_window()
- X
- X{ d_ptr d;
- X
- X d = (d_ptr) safe_malloc(sizeof(d_data));
- X d->frame = NULL;
- X d->panel = NULL;
- X d->is_base_frame = FALSE;
- X d->is_open = TRUE;
- X d->is_popup = FALSE;
- X d->rows = 24;
- X d->columns = 80;
- X d->win_x = -1;
- X d->win_y = -1;
- X d->is_chars = TRUE;
- X d->g_align = NO_ALIGN;
- X d->proportional = FALSE;
- X d->justified = TRUE;
- X d->text_items_exist = FALSE;
- X d->gadget_pos = G_NOPOS;
- X d->gadgets = NULL;
- X d->label = NULL;
- X d->open_action = NULL;
- X d->close_action = NULL;
- X d->g_font = tt_default_font;
- X d->next = NULL;
- X return(d);
- X}
- X
- X/************************************************************************/
- XEXPORT abend(s1, s2, s3, s4, s5, s6, s7, s8, s9)
- X
- Xchar *s1, *s2, *s3, *s4, *s5, *s6, *s7, *s8, *s9;
- X
- X{
- X fprintf(stderr, "%s: ", tt_program);
- X fprintf(stderr, s1, s2, s3, s4, s5, s6, s7, s8, s9);
- X fprintf(stderr, "\n");
- X exit(1);
- X}
- X
- X/************************************************************************/
- XEXPORT int tt_is_number(s)
- X
- Xregister char *s;
- X
- X{ register int saw_digit = FALSE;
- X
- X if (*s == '-' || *s == '+')
- X s++;
- X for ( ; isdigit(*s); s++)
- X saw_digit = TRUE;
- X if (*s == '.')
- X for (s++; isdigit(*s); s++)
- X saw_digit = TRUE;
- X if (*s == 'e' || *s == 'E') {
- X if (*++s == '-' || *s == '+')
- X s++;
- X for ( ; isdigit(*s); s++)
- X saw_digit = TRUE;
- X }
- X return(saw_digit && *s == '\0');
- X}
- X
- X/************************************************************************/
- XEXPORT int tt_dict_compare(l, r)
- X
- Xchar *l;
- Xchar *r;
- X
- X{ register char *p, *q;
- X
- X for (p = l; isdigit(*p); p++)
- X ;
- X for (q = r; isdigit(*q); q++)
- X ;
- X if (*p || *q)
- X return(strcmp(l, r));
- X else
- X return(atoi(l) - atoi(r));
- X}
- X
- X/************************************************************************/
- XEXPORT char *tt_expand_ranges(s)
- X
- Xunsigned char *s;
- X
- X{ unsigned char *p, buf[1024];
- X int c;
- X
- X for (p = buf; *s; s) {
- X *p++ = *s++;
- X if (*s == '-' && *(s + 1) != '\0') {
- X for (c = *(p - 1), s++; c <= *s; )
- X *p++ = c++;
- X s++;
- X }
- X }
- X *p = '\0';
- X return(strsave(buf));
- X}
- X
- X/************************************************************************/
- XEXPORT wait_for_window_size(width, height, timeout)
- X
- Xint width;
- Xint height;
- Xint timeout; /* in milliseconds */
- X
- X{ struct winsize win;
- X
- X if (width > 0 && height > 0)
- X do {
- X if (ioctl(fileno(stderr), TIOCGWINSZ, &win) < 0)
- X abend("could not obtain the window size");
- X usleep(50000);
- X } while ((win.ws_row != height || win.ws_col != width) && (timeout -= 50) > 0);
- X}
- X
- X/************************************************************************/
- XEXPORT int tt_perm_of(st)
- X
- Xstruct stat *st;
- X
- X{
- X if (getuid() == st->st_uid)
- X return((st->st_mode & 0700) >> 6);
- X else if (getgid() == st->st_gid)
- X return((st->st_mode & 070) >> 3);
- X else
- X return((st->st_mode & 07));
- X}
- X
- X/************************************************************************/
- XEXPORT char *tt_full_path_of(s, mode)
- X
- Xchar *s;
- Xint mode;
- X
- X{ char *path, *p, *q;
- X static char full_path[1024];
- X struct stat buf;
- X
- X if (*s == '/')
- X return(s);
- X path = getenv("PATH");
- X for (p = path, q = full_path; TRUE; )
- X if (*p == ':' || *p == '\0') {
- X *q = '\0';
- X strcat(full_path, "/");
- X strcat(full_path, s);
- X if (stat(full_path, &buf) == 0 && ((buf.st_mode & S_IFMT) == S_IFREG) && access(full_path, mode) == 0)
- X return(full_path);
- X q = full_path;
- X if (*p++ == '\0')
- X return(s);
- X }
- X else
- X *q++ = *p++;
- X}
- END_OF_FILE
- if test 11000 -ne `wc -c <'misc.c'`; then
- echo shar: \"'misc.c'\" unpacked with wrong size!
- fi
- # end of 'misc.c'
- fi
- if test -f 'tooltool.h' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'tooltool.h'\"
- else
- echo shar: Extracting \"'tooltool.h'\" \(10629 characters\)
- sed "s/^X//" >'tooltool.h' <<'END_OF_FILE'
- X/************************************************************************/
- X/* Copyright 1988 by Chuck Musciano and Harris Corporation */
- X/* */
- X/* Permission to use, copy, modify, and distribute this software */
- X/* and its documentation for any purpose and without fee is */
- X/* hereby granted, provided that the above copyright notice */
- X/* appear in all copies and that both that copyright notice and */
- X/* this permission notice appear in supporting documentation, and */
- X/* that the name of Chuck Musciano and Harris Corporation not be */
- X/* used in advertising or publicity pertaining to distribution */
- X/* of the software without specific, written prior permission. */
- X/* Chuck Musciano and Harris Corporation make no representations */
- X/* about the suitability of this software for any purpose. It is */
- X/* provided "as is" without express or implied warranty. */
- X/* */
- X/* The sale of any product based wholely or in part upon the */
- X/* technology provided by tooltool is strictly forbidden without */
- X/* specific, prior written permission from Harris Corporation. */
- X/* Tooltool technology includes, but is not limited to, the source */
- X/* code, executable binary files, specification language, and */
- X/* sample specification files. */
- X/************************************************************************/
- X
- X
- X#include <suntool/sunview.h>
- X#include <suntool/panel.h>
- X
- X/* Help delineate where routines are used and defined
- X */
- X#define PUBLIC extern
- X#define PRIVATE static
- X#define EXPORT
- X
- X#define strsave(s) ((char *) strcpy((char *) safe_malloc(strlen(s) + 1), s))
- X#define estrsave(s) ((char *) strcpy((char *) tt_emalloc(strlen(s) + 1), s))
- X#define baseline_of(f) (-((f)->pf_char['0'].pc_home.y))
- X#define charwidth_of(f) ((f)->pf_char['0'].pc_adv.x)
- X#define charheight_of(f) ((f)->pf_defaultsize.y)
- X#define value_of(v) ((v)->is_number? (v)->number : 0.0)
- X
- X/* The gadget position possibilities
- X */
- X#define G_NOPOS -1
- X#define G_TOP 0
- X#define G_BOTTOM 1
- X#define G_LEFT 2
- X#define G_RIGHT 3
- X
- X/* The shift states available for various function keys
- X */
- X#define S_NORMAL 0
- X#define S_SHIFT 1
- X#define S_CONTROL 2
- X#define S_META 4
- X#define MAX_SHIFT_SETS 8
- X
- X/* The kind of gadgets we can create
- X */
- X#define GADGET_BUTTON 0
- X#define GADGET_CHOICE 1
- X#define GADGET_LABEL 2
- X#define GADGET_MENU 3
- X#define GADGET_SLIDER 4
- X#define GADGET_TEXT 5
- X
- X/* Special functions that gadgets can perform
- X */
- X#define BEEP_OP 0
- X#define BREAK_OP 1
- X#define CLOSE_OP 2
- X#define CONTINUE_OP 3
- X#define DISPLAY_OP 4
- X#define EXIT_OP 5
- X#define EXPR_OP 6
- X#define FOR_OP 7
- X#define IF_OP 8
- X#define OPEN_OP 9
- X#define POPUP_OP 10
- X#define REMOVE_OP 11
- X#define SEND_OP 12
- X#define WHILE_OP 13
- X
- X/* How labels are aligned with respect to each other
- X */
- X#define NO_ALIGN 0
- X#define ALIGN_TOP 1
- X#define ALIGN_MIDDLE 2
- X#define ALIGN_BOTTOM 3
- X
- X/* The different function key sets on a Sun-3 keyboard
- X */
- X#define LEFT_KEY_SET 0
- X#define TOP_KEY_SET 1
- X#define RIGHT_KEY_SET 2
- X#define MAX_KEY_SETS 3
- X
- X#define MAX_FUNC_KEYS 15
- X
- X/* Mouse buttons
- X */
- X#define MOUSE_LEFT 0
- X#define MOUSE_CENTER 1
- X#define MOUSE_RIGHT 2
- X
- X#define MAX_MOUSE_BUTTONS 3
- X
- X/* The functions a mouse key can perform
- X */
- X#define MOUSE_UNDEFINED 0
- X#define MOUSE_STRING 1
- X#define MOUSE_MENU 2
- X
- X/* The ways a choice gadget can be laid out
- X */
- X#define CHOICE_CURRENT 0
- X#define CHOICE_CYCLE 1
- X#define CHOICE_HORIZONTAL 2
- X#define CHOICE_VERTICAL 3
- X
- X/* The kinds of symbols a user can define
- X */
- X#define SYMBOL_SYMBOL 0
- X#define SYMBOL_GADGET 1
- X#define SYMBOL_DIALOG 2
- X
- X/* Various expression operators
- X */
- X#define E_AND 0
- X#define E_ARRAY_REF 1
- X#define E_ASSIGN_AND 2
- X#define E_ASSIGN_DIVIDE 3
- X#define E_ASSIGN_MINUS 4
- X#define E_ASSIGN_MODULO 5
- X#define E_ASSIGN_OR 6
- X#define E_ASSIGN_PLUS 7
- X#define E_ASSIGN_TIMES 8
- X#define E_ASSIGN_XOR 9
- X#define E_ASSIGNMENT 10
- X#define E_COMMA 11
- X#define E_COMPLEMENT 12
- X#define E_DIVIDE 13
- X#define E_EQUAL 14
- X#define E_FUNC_ID 15
- X#define E_GREATER 16
- X#define E_GREATER_EQUAL 17
- X#define E_LEFT_SHIFT 18
- X#define E_LESS 19
- X#define E_LESS_EQUAL 20
- X#define E_LOGICAL_AND 21
- X#define E_LOGICAL_NOT 22
- X#define E_LOGICAL_OR 23
- X#define E_MINUS 24
- X#define E_MODULO 25
- X#define E_NOT_EQUAL 26
- X#define E_NUMBER 27
- X#define E_OR 28
- X#define E_PAREN 29
- X#define E_PLUS 30
- X#define E_POSTDECREMENT 31
- X#define E_POSTINCREMENT 32
- X#define E_PREDECREMENT 33
- X#define E_PREINCREMENT 34
- X#define E_QUESTION 35
- X#define E_RIGHT_SHIFT 36
- X#define E_STRING 37
- X#define E_SYMBOL 38
- X#define E_TIMES 39
- X#define E_UMINUS 40
- X#define E_XOR 41
- X
- X/* The kinds of values we can express.
- X */
- X#define V_NOTHING 0
- X#define V_ARRAY 1
- X#define V_GADGET 2
- X#define V_NUMBER 4
- X#define V_INTERVAL 8
- X
- X#define V_TYPES (V_ARRAY | V_NUMBER)
- X#define V_SPECIAL (V_GADGET | V_INTERVAL)
- X
- X#define is_array(v) ((v)->kind & V_ARRAY)
- X#define is_gadget(v) ((v)->kind & V_GADGET)
- X#define is_number(v) ((v)->kind & V_NUMBER)
- X#define is_interval(v) ((v)->kind & V_INTERVAL)
- X
- X/* Special things used to beat a Suntools window size bug
- X */
- X#define POLLING_MAGIC_NUMBER "\001\002\003\004"
- X#define POLLING_TIME_OUT 20000 /* milliseconds */
- X
- X/* The data necessary to describe a label. If "is_icon" is FALSE,
- X * "label" holds the label text, and "font" holds the label font.
- X * If TRUE, "image" holds the bitmap of the icon for the label.
- X */
- Xtypedef struct l_rec l_data, *l_ptr;
- X
- Xstruct l_rec {int is_icon;
- X char *label;
- X struct pixfont *font;
- X struct pixrect *image;
- X };
- X
- X/* The data needed to describe a gadget. "Kind" is one of
- X * GADGET_*, above, and indicates which portion of the union
- X * is valid for this gadget. "Image" contains the image bitmap
- X * for buttons and menus, and labels if they are icons. Sliders
- X * and choices have their own, SunView-created, images. For all
- X * gadgets, "width" and "height" are set to reflect the image
- X * bounding box, for gadget layout purposes. The gadgets are
- X * linked together via "next".
- X */
- X
- Xtypedef struct a_rec a_data, *a_ptr;
- Xtypedef struct cv_rec cv_data, *cv_ptr;
- Xtypedef struct d_rec d_data, *d_ptr;
- Xtypedef struct e_rec e_data, *e_ptr;
- Xtypedef struct g_rec g_data, *g_ptr;
- Xtypedef struct s_rec s_data, *s_ptr;
- Xtypedef struct v_rec v_data, *v_ptr;
- X
- Xtypedef v_ptr (*f_ptr)();
- X
- Xstruct but_rec {l_ptr label[MAX_SHIFT_SETS];
- X a_ptr action[MAX_SHIFT_SETS];
- X Menu menu;
- X };
- X
- Xstruct cv_rec {l_ptr label;
- X a_ptr action;
- X cv_ptr next;
- X };
- X
- Xstruct cho_rec {l_ptr label;
- X int mode;
- X int ch_width;
- X int ch_height;
- X l_ptr mark;
- X l_ptr nomark;
- X cv_ptr value;
- X };
- X
- Xstruct lab_rec {l_ptr label;
- X };
- X
- Xstruct men_rec {l_ptr label;
- X Menu menu;
- X };
- X
- Xstruct sli_rec {l_ptr label;
- X int minimum;
- X int maximum;
- X int initial;
- X int value;
- X int range;
- X int width;
- X a_ptr action;
- X struct pixfont *font;
- X };
- X
- Xstruct tex_rec {l_ptr label;
- X char *trigger;
- X char *completion;
- X char *ignore;
- X int display_len;
- X int retain_len;
- X a_ptr action;
- X struct pixfont *font;
- X };
- X
- Xstruct g_rec {int kind;
- X char *name;
- X Panel_item panel_item;
- X struct pixrect *image;
- X int width;
- X int height;
- X int x;
- X int y;
- X g_ptr next;
- X union {struct but_rec but;
- X struct cho_rec cho;
- X struct lab_rec lab;
- X struct men_rec men;
- X struct sli_rec sli;
- X struct tex_rec tex;
- X } u;
- X };
- X
- X/* The data necessary to describe an action.
- X */
- Xstruct a_rec {int op;
- X e_ptr init;
- X e_ptr expr;
- X e_ptr term;
- X a_ptr body;
- X a_ptr else_part;
- X a_ptr next;
- X };
- X
- X/* The data necessary to describe an expression
- X */
- Xstruct e_rec {int op;
- X e_ptr left;
- X e_ptr right;
- X e_ptr extra;
- X s_ptr symbol;
- X char *string;
- X double value;
- X f_ptr func;
- X };
- X
- X/* The data necessary to describe a value
- X */
- Xstruct v_rec {int kind;
- X char *str; /* except when an array */
- X double number; /* if a number */
- X g_ptr gadget; /* if a gadget */
- X char *index; /* array element index string */
- X v_ptr value; /* if an array */
- X v_ptr left; /* links for array element tree */
- X v_ptr right;
- X };
- X
- X/* The data necessary to describe a symbol.
- X */
- Xstruct s_rec {int kind;
- X char *name;
- X g_ptr gadget; /* if a gadget */
- X d_ptr dialog; /* if a dialog */
- X v_ptr value; /* if a symbol */
- X s_ptr left;
- X s_ptr right;
- X };
- X
- X/* The data necessary to describe a panel
- X */
- Xstruct d_rec {Frame frame;
- X Panel panel;
- X int is_base_frame;
- X int is_open;
- X int is_popup;
- X int rows;
- X int columns;
- X int win_x;
- X int win_y;
- X int is_chars;
- X int g_align;
- X int proportional;
- X int justified;
- X int text_items_exist;
- X int gadget_pos;
- X g_ptr gadgets;
- X char *label;
- X a_ptr open_action;
- X a_ptr close_action;
- X struct pixfont *g_font;
- X d_ptr next;
- X };
- X
- X/* A mouse record holds operation to be performed by one mouse
- X * button/shift-state combination. "Defined" is one of
- X * MOUSE_{UNDEFINED,STRING,MENU}. If MOUSE_STRING, "value" holds
- X * the text to be transmitted. If MOUSE_MENU, "menu" holds
- X * the menu to be displayed.
- X */
- Xtypedef struct m_rec m_data;
- X
- Xstruct m_rec {int defined;
- X a_ptr action;
- X Menu menu;
- X };
- X
- X/* A variety of public data. All globals begin with "tt_".
- X */
- XPUBLIC a_ptr tt_initial_action,
- X tt_timer_action,
- X tt_func_keys[MAX_KEY_SETS][MAX_FUNC_KEYS][MAX_SHIFT_SETS];
- X
- XPUBLIC char *tt_application,
- X *tt_curr_file,
- X *tt_icon,
- X *tt_program;
- X
- XPUBLIC d_ptr tt_base_window;
- X
- XPUBLIC int tt_mouse_base,
- X tt_mouse_chars,
- X tt_errors_occured,
- X tt_normal_off,
- X tt_function_off,
- X tt_action_depth,
- X tt_timer_pending;
- X
- XPUBLIC l_ptr tt_default_mark,
- X tt_default_nomark,
- X tt_default_cycle;
- X
- XPUBLIC m_data tt_mouse[MAX_MOUSE_BUTTONS][MAX_SHIFT_SETS];
- X
- XPUBLIC Menu tt_ttymenu;
- X
- XPUBLIC struct pixfont *tt_default_font,
- X *tt_a_font;
- X
- XPUBLIC struct pixrect tt_mark_image,
- X tt_nomark_image,
- X tt_cycle_image;
- X
- XPUBLIC s_ptr tt_mouse_x, tt_mouse_y, tt_delimiters;
- X
- X/* Public routines which do not return void.
- X */
- XPUBLIC char *safe_malloc();
- XPUBLIC struct pixrect *tt_load_icon();
- XPUBLIC struct pixfont *tt_open_font();
- XPUBLIC l_ptr tt_make_label();
- XPUBLIC a_ptr tt_make_action();
- XPUBLIC s_ptr tt_find_symbol();
- XPUBLIC v_ptr tt_get_value();
- XPUBLIC d_ptr tt_make_base_window();
- XPUBLIC e_ptr tt_make_expr();
- XPUBLIC v_ptr tt_eval();
- XPUBLIC char *tt_string_of();
- XPUBLIC f_ptr tt_is_function();
- XPUBLIC char *tt_emalloc();
- XPUBLIC v_ptr tt_int_result();
- XPUBLIC v_ptr tt_double_result();
- XPUBLIC v_ptr tt_string_result();
- XPUBLIC v_ptr tt_insert_array();
- XPUBLIC char *tt_get_selection();
- XPUBLIC char *tt_expand_ranges();
- XPUBLIC char *tt_full_path_of();
- END_OF_FILE
- if test 10629 -ne `wc -c <'tooltool.h'`; then
- echo shar: \"'tooltool.h'\" unpacked with wrong size!
- fi
- # end of 'tooltool.h'
- fi
- echo shar: End of archive 4 \(of 13\).
- cp /dev/null ark4isdone
- MISSING=""
- for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 ; do
- if test ! -f ark${I}isdone ; then
- MISSING="${MISSING} ${I}"
- fi
- done
- if test "${MISSING}" = "" ; then
- echo You have unpacked all 13 archives.
- rm -f ark[1-9]isdone ark[1-9][0-9]isdone
- else
- echo You still need to unpack the following archives:
- echo " " ${MISSING}
- fi
- ## End of shell archive.
- exit 0
-
-
- Chuck Musciano ARPA : chuck@trantor.harris-atd.com
- Harris Corporation Usenet: ...!uunet!x102a!trantor!chuck
- PO Box 37, MS 3A/1912 AT&T : (407) 727-6131
- Melbourne, FL 32902 FAX : (407) 727-{5118,5227,4004}
-